package com.witframework.dynoengine.render.selector;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.witframework.WitException;
import com.witframework.core.persistence.JdbcTools;
import com.witframework.dynoengine.AbstractParamSetObject;
import com.witframework.util.HtmlBuilder;
/**
 * select选择器的默认实现，可以支持option_value,option_text形式的参数和sql形式的参数
 * PARAM_options的值设置格式为：
 * <li>
 * 值对类型的参数：vp=option_value,option_text;option_value,option_text;..('vp='可以省略)
 * <li>或sql类型的参数：sql=select table.value value,table.text text from table;
 * @author wuxinyang
 *
 */
public class DefaultOptionSelectorRender extends AbstractParamSetObject implements SelectorRender{
	private Map optMap=new HashMap();
	/**
	 * 获取slect field的html格式文本
	 */
	public String render() {
		init();
		String name=(String)this.getParameter(PARAM_name);		
		String defaultValue=(String)this.getParameter(PARAM_defaultValue);		
		HtmlBuilder html=new HtmlBuilder().select().name(name);		
		html.close();
		html.option().value("");
		html.close().append("").optionEnd();
		for(Iterator itor=optMap.keySet().iterator();itor.hasNext();){
			String value=(String)itor.next();//select option的value
			String text=(String)optMap.get(value);//select option的text
			html.option().value(value);
			if(defaultValue!=null
					&&(defaultValue.indexOf(value+",")>=0//为了兼容在一个字段中保存多选的选择值
					||defaultValue.indexOf(value)>=0))
				html.selected();
			html.close().append(text).optionEnd();
		}		
		html.selectEnd();
		return html.toString();
	}
	/**
	 * 获取指定值的option的text文本
	 *  */
	public String getText(String value) {	
		init();
		return (String)optMap.get(value);
	}
	private void init(){
		if(optMap.size()==0){
			optMap=new HashMap();
			String parameter=(String)getParameter(PARAM_parameter);
			if(parameter==null){
				throw new WitException("not set parameter for select option.(OptionSelector.PARAM_options)");
			}
			if(parameter.startsWith("sql=")){//sql语句中必须指定列的别名value和text，如：select x value,y text from X
				String sql=parameter.substring(4);
				List<Map> vpMap=(List<Map>) JdbcTools.queryForList(sql);
				for(Map m:vpMap){
					optMap.put(m.get("VALUE"),m.get("TEXT"));
				}
				
			}else{
				if(parameter.startsWith("vp=")){
					parameter=parameter.substring(3);
				}
				String[] opts=StringUtils.split(parameter, ";");
				for(String opt:opts){
					String[] option=StringUtils.split(opt, ",");
					optMap.put(option[0], option[1]);
				}
			}
			
		}
	}
	

}
